winsafe\mf\com_interfaces/imfmediasession.rs
1#![allow(non_camel_case_types, non_snake_case)]
2
3use crate::co;
4use crate::decl::*;
5use crate::kernel::privs::*;
6use crate::mf::vts::*;
7use crate::ole::privs::*;
8use crate::prelude::*;
9
10com_interface! { IMFMediaSession: "90377834-21d0-4dee-8214-ba2e3e6c1127";
11 /// [`IMFMediaSession`](https://learn.microsoft.com/en-us/windows/win32/api/mfidl/nn-mfidl-imfmediasession)
12 /// COM interface.
13 ///
14 /// Automatically calls
15 /// [`Release`](https://learn.microsoft.com/en-us/windows/win32/api/unknwn/nf-unknwn-iunknown-release)
16 /// when the object goes out of scope.
17 ///
18 /// # Examples
19 ///
20 /// ```no_run
21 /// use winsafe::{self as w, prelude::*};
22 ///
23 /// let media_session = w::MFCreateMediaSession(None::<&w::IMFAttributes>)?;
24 /// # w::HrResult::Ok(())
25 /// ```
26}
27
28impl mf_IMFMediaEventGenerator for IMFMediaSession {}
29impl mf_IMFMediaSession for IMFMediaSession {}
30
31/// This trait is enabled with the `mf` feature, and provides methods for
32/// [`IMFMediaSession`](crate::IMFMediaSession).
33///
34/// Prefer importing this trait through the prelude:
35///
36/// ```no_run
37/// use winsafe::prelude::*;
38/// ```
39pub trait mf_IMFMediaSession: mf_IMFMediaEventGenerator {
40 fn_com_noparm! { ClearTopologies: IMFMediaSessionVT;
41 /// [`IMFMediaSession::ClearTopologies`](https://learn.microsoft.com/en-us/windows/win32/api/mfidl/nf-mfidl-imfmediasession-cleartopologies)
42 /// method.
43 }
44
45 fn_com_noparm! { Close: IMFMediaSessionVT;
46 /// [`IMFMediaSession::Close`](https://learn.microsoft.com/en-us/windows/win32/api/mfidl/nf-mfidl-imfmediasession-close)
47 /// method.
48 }
49
50 fn_com_interface_get! { GetClock: IMFMediaSessionVT => IMFClock;
51 /// [`IMFMediaSession::GetClock`](https://learn.microsoft.com/en-us/windows/win32/api/mfidl/nf-mfidl-imfmediasession-getclock)
52 /// method.
53 }
54
55 /// [`IMFMediaSession::GetFullTopology`](https://learn.microsoft.com/en-us/windows/win32/api/mfidl/nf-mfidl-imfmediasession-getfulltopology)
56 /// method.
57 #[must_use]
58 fn GetFullTopology(
59 &self,
60 flags: co::MFSESSION_GETFULLTOPOLOGY,
61 topo_id: u64,
62 ) -> HrResult<IMFTopology> {
63 let mut queried = unsafe { IMFTopology::null() };
64 ok_to_hrresult(unsafe {
65 (vt::<IMFMediaSessionVT>(self).GetFullTopology)(
66 self.ptr(),
67 flags.raw(),
68 topo_id,
69 queried.as_mut(),
70 )
71 })
72 .map(|_| queried)
73 }
74
75 /// [`IMFMediaSession::GetSessionCapabilities`](https://learn.microsoft.com/en-us/windows/win32/api/mfidl/nf-mfidl-imfmediasession-getsessioncapabilities)
76 /// method.
77 #[must_use]
78 fn GetSessionCapabilities(&self) -> HrResult<co::MFSESSIONCAP> {
79 let mut caps = co::MFSESSIONCAP::default();
80 ok_to_hrresult(unsafe {
81 (vt::<IMFMediaSessionVT>(self).GetSessionCapabilities)(self.ptr(), caps.as_mut())
82 })
83 .map(|_| caps)
84 }
85
86 fn_com_noparm! { Pause: IMFMediaSessionVT;
87 /// [`IMFMediaSession::Pause`](https://learn.microsoft.com/en-us/windows/win32/api/mfidl/nf-mfidl-imfmediasession-pause)
88 /// method.
89 }
90
91 /// [`IMFMediaSession::SetTopology`](https://learn.microsoft.com/en-us/windows/win32/api/mfidl/nf-mfidl-imfmediasession-settopology)
92 /// method.
93 fn SetTopology(
94 &self,
95 flags: co::MFSESSION_SETTOPOLOGY,
96 topology: &impl mf_IMFTopology,
97 ) -> HrResult<()> {
98 ok_to_hrresult(unsafe {
99 (vt::<IMFMediaSessionVT>(self).SetTopology)(self.ptr(), flags.raw(), topology.ptr())
100 })
101 }
102
103 fn_com_noparm! { Shutdown: IMFMediaSessionVT;
104 /// [`IMFMediaSession::Shutdown`](https://learn.microsoft.com/en-us/windows/win32/api/mfidl/nf-mfidl-imfmediasession-shutdown)
105 /// method.
106 }
107
108 /// [`IMFMediaSession::Start`](https://learn.microsoft.com/en-us/windows/win32/api/mfidl/nf-mfidl-imfmediasession-start)
109 /// method.
110 ///
111 /// # Examples
112 ///
113 /// ```no_run
114 /// use winsafe::{self as w, prelude::*, co};
115 ///
116 /// let session: w::IMFMediaSession; // initialized somewhere
117 /// # let session = unsafe { w::IMFMediaSession::null() };
118 ///
119 /// session.Start(
120 /// co::MF_TIME_FORMAT::NULL,
121 /// &w::PropVariant::Empty,
122 /// )?;
123 /// # w::HrResult::Ok(())
124 /// ```
125 fn Start(&self, time_format: co::MF_TIME_FORMAT, start_position: &PropVariant) -> HrResult<()> {
126 ok_to_hrresult(unsafe {
127 (vt::<IMFMediaSessionVT>(self).Start)(
128 self.ptr(),
129 pcvoid(&time_format),
130 pcvoid(&start_position.to_raw()?),
131 )
132 })
133 }
134
135 fn_com_noparm! { Stop: IMFMediaSessionVT;
136 /// [`IMFMediaSession::Stop`](https://learn.microsoft.com/en-us/windows/win32/api/mfidl/nf-mfidl-imfmediasession-stop)
137 /// method.
138 }
139}